Passed
Push — master ( a485dd...9339af )
by Kyungmi
01:25
created

error-handler.js ➔ ???   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1

Importance

Changes 6
Bugs 0 Features 0
Metric Value
cc 1
c 6
b 0
f 0
nc 1
dl 0
loc 5
ccs 1
cts 1
cp 1
crap 1
rs 9.4285
nop 1
1
/**
2
 * Hapi middleware for handling errors
3
 *
4
 * @since 1.0.0
5
 */
6
7 4
const NotifierError = require('../common/Error');
8
9 4
const defaultOptions = Object.freeze({
10
  apiPrefix: '/api',
11
  errorView: 'error',
12
});
13
14 8
const generateErrorResponseBody = request => ({
15
  code: request.response.errorCode,
16
  message: request.response.message,
17
  success: false,
18
});
19
20 8
const getStatusCode = request => request.response.statusCode || request.response.output.statusCode;
21
22
/* eslint no-param-reassign: ["error", { "props": false }] */
23 4
const onSuccess = (request, reply, options) => {
24 26
  const path = request.path;
25 26
  if (path.includes(options.apiPrefix)) {
26 26
    const responseObj = request.response.source || {};
27 26
    responseObj.success = true;
28 26
    request.response.source = responseObj;
29
  }
30 26
  return null;
31
};
32
33 4
const onApiError = (request, reply) => {
34 8
  const statusCode = getStatusCode(request);
35 8
  const responseBody = generateErrorResponseBody(request);
36 8
  switch (statusCode) {
37
    case 400:
38 4
      if (request.response.data && request.response.data.name === 'ValidationError') {
39 1
        responseBody.code = NotifierError.Types.BAD_REQUEST_INVALID.code;
40 1
        responseBody.message = NotifierError.Types.BAD_REQUEST_INVALID.message({ message: request.response.message });
41
      }
42 2
      return reply(responseBody).code(statusCode);
43
    case 401:
44
    case 403:
45 2
      return reply(responseBody).unstate('token').code(statusCode);
46
    case 500:
47 2
      if (!responseBody.code) {
48
        responseBody.code = NotifierError.Types.SERVER.code;
49
      }
50
      return reply(responseBody).code(statusCode);
51
    default:
52 4
      return reply(responseBody).code(statusCode);
53
  }
54
};
55
56 4
const onUIError = (request, reply, options) => {
57
  const statusCode = getStatusCode(request);
58
  const responseBody = generateErrorResponseBody(request);
59 5
  switch (statusCode) {
60
    case 401:
61
    case 403:
62 2
      return reply.redirect(`/login?redirect=${request.path || '/'}`).unstate('token');
63
    case 404:
64
    case 500:
65
      responseBody.statusCode = statusCode;
66
      return reply.view(options.errorView, responseBody).code(statusCode);
67
    default:
68
      return null;
69
  }
70
};
71
72 4
const onError = (request, reply, options) => {
73 8
  const isApi = request.path.includes(options.apiPrefix);
74 8
  return isApi
75
    ? onApiError(request, reply)
76
    : onUIError(request, reply, options);
77
};
78
79 4
const register = (server, opts, next) => {
80 4
  const options = Object.assign({}, defaultOptions, opts);
81 4
  server.ext('onPreResponse', (request, reply) => {
82 34
    const statusCode = request.response.statusCode || request.response.output.statusCode;
83 34
    const response = (statusCode === 200)
84
      ? onSuccess(request, reply, options)
85
      : onError(request, reply, options);
86
87 34
    if (response) {
88 8
      return response;
89
    }
90 26
    return reply.continue();
91
  });
92 4
  next();
93
};
94
95 4
register.attributes = {
96
  name: 'hapi-error-handler',
97
  version: '1.0.0',
98
};
99
100
module.exports = register;
101